import axios from 'axios'
import { showLoading, hideLoading } from '@/utils/loading'
import { message } from '@/utils/message' 
import type { ApiResponse } from '@/types/response'

// 扩展 AxiosRequestConfig 类型
declare module 'axios' {
  export interface AxiosRequestConfig {
    showLoading?: boolean
  }
}

// 创建 axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL, // 自动读取当前环境变量
  timeout: 10000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    if (config.showLoading !== false) {
      showLoading('加载中...')
    }

    // 初始化请求数据对象
    if (!config.data) {
      config.data = {}
    }

    const user = JSON.parse(localStorage.getItem('user') || '{}')
    
    // 如果是GET请求，使用params
    if (config.method?.toLowerCase() === 'get') {
      config.params = config.params || {}
      config.params.token = user?.token
      config.params.operatorId = user?.userId || ""
      config.params.clientTime = new Date().toISOString()
      config.params.clientVersion = import.meta.env.VITE_VERSION
      config.params.systemId = import.meta.env.VITE_SYSTEM_ID
    } else {
      // POST等其他请求，使用data
      const originalData = { ...config.data }  // 保存原始数据
      config.data = {
        request: originalData,  // 原始数据放入request字段
        token: user?.token,
        operatorId: user?.userId || "",
        clientTime: new Date().toISOString(),
        clientVersion: import.meta.env.VITE_VERSION,
        systemId: import.meta.env.VITE_SYSTEM_ID
      }
    }

    return config
  },
  error => {
    hideLoading()
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
    response => {
      hideLoading()
      
      // 假设后端返回格式：{ code: 0, data: {}, msg: 'xxx' }
      const res = response.data
      console.log('request res:',res)
      if (res.code !== 200) {
        // 统一错误提示
        message.error(res.msg || '请求失败')
        // 可以根据业务需要，401等特殊处理
        if (res.code === 401) {
          message.error(res.msg || '登录已过期，请重新登录')
          // 例如跳转登录
        }
        return Promise.reject(res)
      }
      return res.data // 只返回 data
    },
    error => {
      // 网络错误、超时等
      message.error(error.message || '网络异常')
      return Promise.reject(error)
    }
  )

export default service